/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pl.elka.gis.main.helper;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import pl.elka.gis.main.node.Edge;
import pl.elka.gis.main.node.Node;

/**
 *
 * @author Marcin
 */
public class GraphHelper {

    public static HashMap<Node, Set<Edge>> bulidGraph(Map<String, Set<String>> nodesMap) {
        HashMap<Node, Set<Edge>> graph = new HashMap<Node, Set<Edge>>();
        //dla wszystkich wierzchołków
        for(String vName:nodesMap.keySet()) {
            //wybierz wierzchołek
            Node v = new Node(vName, 0, 0);
            if (graph.containsKey(v)) {
                Iterator<Node> i = graph.keySet().iterator();
                while (i.hasNext()) {
                    Node n = i.next();
                    if (n.equals(v)){
                        v=n;
                        break;
                    }
                }
            }
            //dla wszystkich jego krawędzi
            HashSet<Edge> vEdges = new HashSet<Edge>();
            //wierzchołki po drugich stronach krawędzi
            HashSet<Node> vNodes = new HashSet<Node>();
            for(String trgName:nodesMap.get(vName)) {
                //utwórz wierchołek sąsiadujący
                Node trg = new Node(trgName,0,0);
                //utwórz krawędź i poszukaj, czy taka nie istnieje już w grafie
                //jeśli istnieje, należy ją podmienić
                Edge e = new Edge(v, trg);
                //skoro istnieje już w grafie wierzchołek, to może istnieć też krawędź
                //nie zawsze jednak musi: czasem wierchołek b
                //do którego odnosimy się z wierzchołka a
                //został dodany przez wierzchołek c - krawędź ab nie istnieje!
                if (graph.containsKey(trg)) {
                    //pobierz wierzchołek
                    Iterator<Node> iN = graph.keySet().iterator();
                    while (iN.hasNext()) {
                        Node n = iN.next();
                        if (n.equals(trg)){
                            trg=n;
                            break;
                        }
                    }                    
                    //pobierz krawędź
                    Set<Edge> trgEdges = graph.get(trg);
                    //istnieją krawędzie w tym wierzchołku - weźmy tą, o którą chodzi
                    if (trgEdges!=null){
                    Iterator<Edge> iE = trgEdges.iterator();
                        while (iE.hasNext()) {
                            Edge n = iE.next();
                            if (n.equals(e)){
                                e=n;
                                break;
                            }
                        }
                    }
                } else {
                    //należy dodać wierzhołek do grafu
                    graph.put(trg, null);                    
                }
                //dodaj krawędź do zbioru krawędzi incydentnych z wierzchołkiem
                vEdges.add(e);
                //dodaj wierzchołek do zbioru wierzchołków sąsiadujących z wierzchołkiem v
                vNodes.add(trg);
            }
            //wstaw zbiór krawędzi incydentnych z wierchołkiem do wierzchołka
            //zbiór wymagany do określenia stopnia wierzchołka metodą compareTo
            v.setAvailableNodes(vNodes);
            //wstaw wierchołek i krawędzie do grafu
            graph.put(v, vEdges);
        }
        return graph;
    }

}

